블로그 릴레이 - AWS RDS on PostgreSQL 에서 pg_cron 사용해보기

블로그 릴레이 - AWS RDS on PostgreSQL 에서 pg_cron 사용해보기

블로그에서는 AWS RDS on PostgreSQL 에서 pg_cron 를 설치하는 방법과 사용 방법을 정리합니다.
Clock Icon2024.08.18

안녕하세요! AWS 사업 본부의 임채정입니다.

본 블로그는 당사의 한국어 블로그 릴레이의 여덟 번째 블로그입니다.

이번 블로그의 주제는「AWS RDS on PostgreSQL 에서 pg_cron 사용해보기」입니다.

검증을 위한 데이터베이스(PostgreSQL) 구축

AWS에서 제공하는 PostgreSQL 에서는 기본적으로 pg_cron 을 제공하지 않습니다.
그렇기 때문에 pg_cron 을 사용하기 위해서는 PostgreSQL 확장 기능을 통해 추가로 설정, 활성화를 해야 합니다.

이번 블로그에서는 AWS RDS on PostgreSQL 에서 pg_cron을 사용하기 위한 파라미터 그룹의 설정과 pg_cron 모듈의 활성화, 사용 방법에 대해 정리하겠습니다.

먼저 검증을 위해 데이터베이스를 하나 작성하겠습니다.
작성한 데이터베이스의 스팩은 다음과 같습니다. (관계없는 스팩 정보는 생략했습니다.)

  • 엔진 버전 : PostgreSQL 16.3-R2 (기본값)
  • 인스턴스 타입 : db.t3.micro
  • DB 파라미터 그룹 : default.postgres16 (기본값)

모듈 활성화하기 전에 실행 테스트

그럼 pg_cron 을 활성화 하기 전에 pg_cron 을 실행해봤을 때 어떻게 표시되는지 테스트 해보겠습니다.

현재 데이터베이스에서 사용가능한 확장 모듈은 pg_available_extensions 테이블에서 확인합니다.
또한, 현재 활성화되어 있는 확장 모듈은 pg_extension 테이블에서 확인할 수 있습니다.

pg_available_extensions 에서 pg_cron 확장 모듈 확인
> SELECT * FROM pg_available_extensions WHERE name = 'pg_cron';
# name   |default_version|installed_version|comment                     |
# -------+---------------+-----------------+----------------------------+
# pg_cron|1.6            |                 |Job scheduler for PostgreSQL|
pg_extension 에서 활성화되어 있는 확장 모듈
확인 
> SELECT * FROM pg_extension;
# oid  |extname|extowner|extnamespace|extrelocatable|extversion|extconfig|extcondition|
# -----+-------+--------+------------+--------------+----------+---------+------------+
# 14501|plpgsql|      10|          11|false         |1.0       |NULL     |NULL        |

결과에서 확인 가능하듯 pg_cron 은 활성화되어 있지 않습니다.

pg_cron 의 활성화
> CREATE EXTENSION pg_cron;
# SQL Error [XX000]: ERROR: pg_cron can only be loaded via shared_preload_libraries
#   Hint: Add pg_cron to the shared_preload_libraries configuration variable in postgresql.conf.

활성화시키기 위해서 명령어를 실행하면 postgresql.confshared_preload_libraries 구성 변수에 pg_cron을 추가해야 한다고 에러가 발생합니다.

하지만 AWS RDS on PostgreSQL 을 사용할 시에는 postgresql.conf 파일에 직접 접근할 수 없습니다.
대신에 파라미터 그룹을 통해 해당 설정을 관리할 수 있습니다.

pg_cron 활성화하기

그럼 PostgreSQL 데이터베이스에 pg_cron 을 활성화해보겠습니다.

먼저 이번 블로그에서 작성한 데이터베이스의 스팩을 다시 한 번 확인하겠습니다.

  • 엔진 버전 : PostgreSQL 16.3-R2 (기본값)
  • 인스턴스 타입 : db.t3.micro
  • DB 파라미터 그룹 : default.postgres16 (기본값)

위에서 확인을 했다시피 pg_cron 을 사용하기 위해서 shared_preload_libraries 구성 변수의 수정이 필요합니다.
그리고 AWS에서는 파라미터 그룹을 통해 shared_preload_libraries 구성 변수등 관리하고 있습니다.

하지만 이번에 검증을 위해 구축한 데이터베이스에 설정한 기본값의 파라미터 그룹은 수정할 수 없기 때문에 새로운 파라미터 그룹을 생성해서 데이터베이스에 할당해주겠습니다.

새로운 파라미터 그룹의 생성

새로운 파라미터 그룹을 생성합니다.

01

  • 파라미터 그룹 이름 : 임의
  • 설명 : 임의
  • 엔진 유형 : PostgreSQL
  • 파라미터 그룹 패밀리 : postgres16
    • 유형 : DB Parameter Group

02

다음과 같이 기본 설정의 파라미터 그룹이 생성되었습니다.
편집을 위해 오른쪽 위의 편집을 클릭합니다.

03

그럼 파라미터들을 수정할 수 있습니다.
검색창에 shared_preload_libraries 을 검색해서 값에 pg_cron 을 추가하고 저장합니다.

04

새로운 파라미터 그룹을 데이터베이스에 할당하기

파라미터 그룹을 생성하고 설정 변경까지 완료되었다면 데이터베이스에 할당해주겠습니다.

데이터베이스의 추가 구성에서 파라미터 그룹을 이번에 생성한 걸로 수정해주고 즉시 적용을 시키겠습니다.

05
06

그럼 데이터베이스의 상태가 수정중이 되었다가 시간이 지나면 사용 가능으로 변경됩니다.

그 후에 데이터베이스의 상세 페이지의 구성 탭에 들어가서 확인을 해보면 파라미터 그룹이 변경은 되었지만 옆에 재부팅 보류 중라고 적혀있는 것을 확인할 수 있습니다.

07

파라미터 그룹의 shared_preload_libraries 구성을 동기화시키기 위해 데이테베이스를 재부팅합니다.
그러면 데이터베이스의 상태가 재부팅 중이 되었다가 시간이 지나면 사용 가능으로 변경됩니다.
다시 한 번 데이터베이스의 상세 페이지의 구성 탭에 들어가서 확인을 해보면 파라미터 그룹의 동기화가 완료되었다는 걸 확인할 수 있습니다.

08

pg_cron 활성화

이번에는 다시 데이터베이스에 접속해서 pg_cron 을 활성화 시키겠습니다.

pg_cron 의 활성화
> CREATE EXTENSION pg_cron;

활성화되어 있는 모듈을 확인해보면 pg_cron 이 성공적으로 활성화되어 있습니다.

pg_extension 에서 활성화되어 있는 확장 모듈
> SELECT * FROM pg_extension;
# oid  |extname   |extowner|extnamespace|extrelocatable|extversion|extconfig                |extcondition |
# -----+----------+--------+------------+--------------+----------+-------------------------+-------------+
# 14501| plpgsql |      10|          11|false         |1.0       |NULL                     |NULL         |
# 16470|⭐️pg_cron⭐️|      10|          11|false         |1.6       |{16473,16472,16493,16492}|{"","","",""}|

pg_cron 사용하기

pg_cron 의 확장 모듈도 설정되었으니 사용해보겠습니다.

pg_cron 설정 방법
SELECT cron.schedule('[cron 표현식]', $$[SQL 명령어]$$);

실제 명령어를 넣어서 사용해보겠습니다.

pg_cron 사용해보기
# 검증을 위해 cron 표현식은 1분에 한 번씩 실행하도록 설정
# 임의로 생성한 test_table 를 ANALYZE 하는 명령어는 실행
> SELECT cron.schedule('* * * * *', $$ANALYZE test_table$$);

스케줄이 제대로 설정되었는가 확인하는 명령어를 포함해서 변경 삭제하는 명령어도 같이 정리했으니 참고해주세요

pg_cron 리스트 확인
> SELECT * FROM cron.job;
# jobid|schedule |command           |nodename |nodeport|database|username|active|jobname|
# -----+---------+------------------+---------+--------+--------+--------+------+-------+
#     1|* * * * *|ANALYZE test_table|localhost|    5432|postgres|postgres|true  |       |
pg_cron 실행 결과 확인
> SELECT * FROM cron.job_run_details;
# jobid|runid|job_pid|database|username|command           |status   |return_message|start_time                   |end_time                     |
# -----+-----+-------+--------+--------+------------------+---------+--------------+-----------------------------+-----------------------------+
#     1|    1|   3071|postgres|postgres|ANALYZE test_table|succeeded|ANALYZE       |2024-08-18 04:18:00.130 +0900|2024-08-18 04:18:00.138 +0900|
#     1|    2|   3117|postgres|postgres|ANALYZE test_table|succeeded|ANALYZE       |2024-08-18 04:19:00.117 +0900|2024-08-18 04:19:00.137 +0900|
#     1|    3|   3163|postgres|postgres|ANALYZE test_table|succeeded|ANALYZE       |2024-08-18 04:20:00.015 +0900|2024-08-18 04:20:00.101 +0900|
#     1|    4|   3209|postgres|postgres|ANALYZE test_table|succeeded|ANALYZE       |2024-08-18 04:21:00.033 +0900|2024-08-18 04:21:00.092 +0900|
#     1|    5|   3255|postgres|postgres|ANALYZE test_table|succeeded|ANALYZE       |2024-08-18 04:22:00.018 +0900|2024-08-18 04:22:00.144 +0900|
#     1|    6|   3303|postgres|postgres|ANALYZE test_table|succeeded|ANALYZE       |2024-08-18 04:23:00.174 +0900|2024-08-18 04:23:00.189 +0900|
pg_cron 상태 변경
# 반대로 활성화시키려면 false 대신에 true 입력
# (같은 방식으로 command 나 schedule 의 변경도 가능)
> UPDATE cron.job SET active = false WHERE jobid = 1;

# pg_cron 리스트에서 변경한 결과 확인 (⭐️로 표시)
> SELECT * FROM cron.job;
# jobid|schedule |command           |nodename |nodeport|database|username|active|jobname|
# -----+---------+------------------+---------+--------+--------+--------+------+-------+
#     1|* * * * *|ANALYZE test_table|localhost|    5432|postgres|postgres|⭐️false⭐️ |       |
pg_cron 삭제
> SELECT cron.unschedule(1);
# unschedule|
# ----------+
# true      |

# 결과 확인을 위해 pg_cron 리스트 출력
> SELECT * FROM cron.job;
# jobid|schedule|command|nodename|nodeport|database|username|active|jobname|
# -----+--------+-------+--------+--------+--------+--------+------+-------+
# 삭제했기 때문에 결과 없음

마무리

이상, 한국어 블로그 릴레이의 여덟 번째 블로그「AWS RDS on PostgreSQL 에서 pg_cron 사용해보기」편이었습니다.
다음 아홉 번째 블로그 릴레이는 8월 넷째 주에 공개됩니다.

끝까지 읽어주셔서 감사합니다! 이상, AWS 사업 본부의 임채정이었습니다.

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.